//
//  JBaseModel.h
//  jhf
//
//  Created by 计海峰 on 2017/11/23 14:05:37.
//  Copyright © 2017年 计海峰. All rights reserved.
//

#import <Foundation/Foundation.h>

//主键
#define primaryId @"pk"

//时间戳
#define jStamp @"jTimeStamp"

@interface JBaseModel:NSObject

/** 主键 id mj不能忽略 */ 
@property (nonatomic, assign) int pk;

/** 时间戳 */
@property (nonatomic, assign) long jTimeStamp;

/** 原主键名 */
@property (nonatomic, copy) NSString *pkName;

/** 列名 */
@property (retain, readonly, nonatomic) NSMutableArray         *columeNames;

/** 数据库 列类型 */
@property (retain, readonly, nonatomic) NSMutableArray         *columeTypes;

/** 本地实际 列类型 */
@property (retain, readonly, nonatomic) NSMutableArray         *columeRealTypes;

#pragma mark - util 生成sql

/**
 *  生成条件sql
 *
 *  @param columeNames 属性
 */
- (NSString *)generateCriterias:(NSArray<NSString *> *)columeNames;

/**
 *  生成条件sql
 *
 *  @param columeName 属性
 */
- (NSString *)generateCriteria:(NSString *)columeName;

#pragma mark - 增加Model
/**
 *  保存或者更新某个model
 *
 *  @param criteria 该用户的条件 例如用户id 先找到这个用户再更新 传空则存一个新的
 *
 *  @return 是否成功
 */
- (BOOL)saveOrUpdate:(NSString *)criteria;

/**
 *  保存或者更新某个model
 *
 *  @return 是否成功
 */
- (BOOL)saveOrUpdate;

#pragma mark - 按照对象删除model
/**
 *  删除某个model
 *
 *  @return 是否成功
 */
- (BOOL)deleteData;

/**
 *  按条件删除 传空则全部删除
 *
 *  @param criteria 删除条件
 *
 *  @return 删除结果
 */
+ (BOOL)deleteData:(NSString *)criteria;

#pragma mark - 查询

/**
 *  根据系统主键 查找是否有model
 *
 *  @param pkValue pkName的对应值
 *
 *  @return 存在结果
 */
+ (JBaseModel *)isExistsByPkValue:(NSString *)pkValue;

/**
 *  是否存在某个数据 存在返回该数据 不存在返回空 value需要加''
 *
 *  @param criteria 存在条件
 *
 *  @return 存在结果
 */
+ (JBaseModel *)isExists:(NSString *)criteria;

/**
 *   按条件查询 传空则查询全部
 *
 *  @param criteria 查询条件
 *
 *  @return 查询结果列表
 */
+ (NSMutableArray *)queryData:(NSString *)criteria;

#pragma mark - ⚡️ 必须重写的方法

/**
 获取服务器主键的名字

 @return 主键名字
 */
+ (NSString *)getPkName;


/**
 是否需要新建对应的table

 @return bollean
 */
+ (BOOL)needCreateTable;

#pragma mark - 可能需要重写的方法
/**
 *  获取表名
 *
 *  @return 不用默认名称
 */
+ (NSString *)getTableName;

/*
 * 如果子类中有一些property不需要创建数据库字段，那么这个方法必须在子类中重写
 */
+ (NSArray *)transients;

//全部更新
+ (BOOL)updateAll:(NSString *)criteria;

@end
